<?php
class Controller{

		public $request; //Objet request
		private $vars = array(); //var à passer à la vue
		public $layout = 'default'; //layout à utiliser pour rendre la vue
		private $rendered = false; //si le rendu a été fait ou pas


		/**
		 * constructeur
		 * @param $request Objet request de l'application
		 */
		function __construct($request = null){
			$this->Session = new Session();
			$this->Form = new Form($this); 
			if ($request){
				$this->request = $request; // on stocke la request dans l'instance	
			}
			require ROOT.DS.'config'.DS.'hook.php';
		}

		/**
		 * permet de rendre une vue
		 * @param $view fichier a rendre (chemin depuis view ou nom de la vue)
		 */
		public function render($view) {
			if($this->rendered){ return false; }
			extract($this->vars);
			if(strpos($view,'/')===0){
				$view = ROOT.DS.'view'.$view.'.php';
			}else{
				$view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
			}
			ob_start();
            // si il y a une requête ajax alors on charge pas la vue
		    if (!$this->isAjax()) {
		        require($view);
		    }
     
		    $content_for_layout = ob_get_clean();  
		                // si il y a une requête ajax alors on charge pas le layout
		    if (!$this->isAjax()) {
		        require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php'; 
		    }

    		$this->rendered = true; 
		}


		function isAjax() {
		   return (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
		              &&
		            ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
		}
		
		/**
		 * permet de passer une ou plusieurs variable à la vue
		 * @param $key nom de la variable ou tableau de variables
		 * @param $value valeur de la variable
		 */
		public function set($key,$value=null) {
			if(is_array($key)){
				$this->vars += $key;
			}else{
				$this->vars[$key] = $value;
			}
			
		
		}
		
		/**
		*Permet de charger un model
		**/
		function loadModel($name){
			$file = ROOT.DS.'model'.DS.$name.'.php';
			require_once($file);
			if(!isset($this->$name)){
			$this->$name = new $name();
			}
			else{
				e404($message);
			}
			
		}

		/**
		 * permet de gérer les erreurs 404
		 */
		function e404($message) {
			header("HTTP/1.0 404 Not Found");
			$this->set('message',$message);
			$this->render('/errors/404');
			die();
		}


		/**
		 * permet d'appeler un controller depuis une vue
		 */
		function request($controller,$action) {
			$controller .= 'Controller';
			//die($controller);
			require_once ROOT.DS.'controller'.DS.$controller.'.php';
			$c = new $controller();
			return $c->$action();
		}

		/**
		 * redirect
		 */
		function redirect($url,$code = null) {
			if($code == 301){
				header("HTTP/1.1 301 Moved Permanently");
			}
			header("Location: ".Router::url($url));
		}

}
?>